<%--
  Created by IntelliJ IDEA.
  User: hb
  Date: 2022/3/14
  Time: 10:32
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!-- 声明 Spring Security 的 JSP 标签库 -->
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
<html>
<head>
    <title>Title</title>
    <link rel="stylesheet" href="<s:url value="/resources/styles.css"/>" />
</head>
<body>
    <!-- 显示用户的认证信息 -->
    <!-- property 用来标示用户认证对象的一个属性。可用的属性取决于用户认证的方式。但是，我们可以依赖几个通用的属性，在不同的认证方式下，它们都是可用的，
     如下：
     1、authorities：一组用于表示用户所授予权限的GrantedAuthority对象。
     2、Credentials：用于核实用户的凭证（通常，这会是用户的密码）。
     3、details：认证的附加信息（IP 地址、证件序列号、会话 ID 等）。
     4、principal：用户的基本信息对象。-->
    Hello <security:authentication property="principal.username" />!

    <%-- 当像前面示例那样使用时，<security:authentication> 将在视图中渲染属性的值。但是如果你愿意将其赋值给一个变量，那只需要在 var 属性中指明变量的名字即可。 --%>
    <!-- 这个变量默认是定义在页面作用域内的。但是如果你愿意在其他作用域内创建它，例如请求或会话作用域（或者是能够在 javax.servlet.jsp.PageContext 中获取的其他作用域），
     那么可以通过 scope 属性来声明。 -->
    <security:authentication property="principal.username" var="loginId" scope="request" />

    <%-- Spring Security 的 <security:authorize> JSP 标签能够根据用户被授予的权限有条件地渲染页面的部分内容。 --%>
    <%-- access 属性被赋值为一个 SpEL 表达式，这个表达式的值将确定 <security: authorize> 标签主体内的内容是否渲染。 --%>
    <security:authorize access="hasRole('ROLE_SPITTER')">
        <s:url value="/spittles" var="spittle_url" />
        <sf:form modelAttribute="spittle" action="${spittle_url}">
            <sf:label path="text">
                <s:message code="label.spittle" text="Enter spittle:"></s:message>
            </sf:label>
            <sf:textarea path="text" rows="2" cols="40"></sf:textarea>
            <sf:errors path="text"></sf:errors>
            <br/>
            <div class="spitItSubmitIt">
                <input type="submit" value="Spit it!" class="status-btn round-btn disabled" />
            </div>
        </sf:form>
    </security:authorize>

    <%-- 配合 Spring Security 配置中为 “/admin” 声明了安全性约束，可以这样使用 url 属性，只有满足安全性认证 <security:authorize> 标签主体中的内容才会被渲染 --%>
    <security:authorize url="/admin">
        <s:url value="/admin" var="admin_url" />
        <br/><a href="${admin_url}">Admin</a>
    </security:authorize>
</body>
</html>
